package org.grottarossa.aeroflow.data;

import org.grottarossa.data.Query;
import org.grottarossa.data.exception.QueryException;
import org.grottarossa.driver.ECMBuilderTemplate;
import org.grottarossa.template.data.enums.EnumDataType;
import org.grottarossa.template.data.pojo.table.Cell;
import org.grottarossa.template.data.pojo.table.Record;
import org.grottarossa.template.data.pojo.table.Table;
import org.grottarossa.template.data.pojo.users.User;
import org.grottarossa.template.data.pojo.users.UserList;
import org.grottarossa.template.data.pojo.utils.Container;


/**
*
* La classe implementa il meccanismo per il recupero dei fields relativi agli utenti di aeroflow
*
* @author Marco Sabatini (sabatini.m@gmail.com)
* @author Maurizio Farina (maurizio.farina@gmail.com)
* @author Marco Trischitta (marco.trischitta@gmail.com)
*
* @version %I%, %G%
* @since 1.0
*
* */
public class UsersQuery extends Query
{
	public UsersQuery(ECMBuilderTemplate builder)
	{
		super(builder);
	}

	/**
	 * Il metodo esegue la query che recupera i valori del field da recuperare.
	 *
	 * @param type E' un'oggetto di tipo ResultSetType serve per indicare il tipo di container che il metodo deve fornire
	 * @return Container E' il container in cui vengono memorizzate le informazioni e passate alla parte di front-end
	 *
	 * */
	@Override
	public Container execute(ResultSetType type) throws QueryException
	{
		UserList users = m_builder.getUserManagement().getUsers(null);

		this.setMasterPropertyName("value");//e' il valore che viene visualizzato nel front-end
		this.setStoragePropertyName("key");//e' il valore che viene memorizzato nei pojo

		Table table = new Table();
		table.getHeader().add(new Cell("key", EnumDataType.String, "key"));
		table.getHeader().add(new Cell("value", EnumDataType.String, "value"));

		for(User u : users)
		{
			if(!u.getLoginID().equals("SONORA"))
			{
				Record record = new Record();
				record.add(new Cell("key", EnumDataType.String, u.getLoginID()));
				record.add(new Cell("value", EnumDataType.String, u.getDisplayName()));

				if(filter == null)
				{
					table.getRecords().add(record);
				}
				else
				{
					u.buildRolesHashMap();
					if(filter.getFilter(User.ROLES)!=null)
					{
						for(Object filterVal:filter.getFilter(User.ROLES))
						{
							String val = (String) filterVal;

							if(u.getRoleHashMap().containsKey(val))
							{
								table.getRecords().add(record);
								break;
							}
						}
					}
				}
			}
		}
		return table;
	}
}
